//Copyright 2009 Dominik Punz
//
//Licensed under the Apache License, Version 2.0 (the "License");
//you may not use this file except in compliance with the License.
//You may obtain a copy of the License at
//
//http://www.apache.org/licenses/LICENSE-2.0
//
//Unless required by applicable law or agreed to in writing, software
//distributed under the License is distributed on an "AS IS" BASIS,
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//See the License for the specific language governing permissions and
//limitations under the License.

#ifndef javaReflection_h__
#define javaReflection_h__

#include "objectFactory.h"
#include <string>
#include <cassert>

class CJavaReflection
{
public:
  CJavaReflection(CObjectFactory* pObjectFactory) : mpObjectFactory(pObjectFactory) { assert(pObjectFactory); }
private:
  CJavaReflection() { assert(false); } // don't allow default constructor

public:
  HRESULT GetMethodList(jobject jobjTestObject, VARIANT* pvarResult);
  HRESULT InvokeDynamicMethod(jobject jobjTestObject, const std::wstring& methodName, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr);
  void JobjectToVariant(jobject jobjObjectValue, VARIANT* pVariant);
  jobject VariantToJobject(VARIANT* pVariant);

private:
  jobjectArray ConvertParameters(DISPPARAMS* pdispparams);
  std::wstring GetReadableType(jclass clazz);
  jobject FindMethod(jobject instance, const std::wstring& methodName, jobjectArray jobjarrParams, UINT numberOfArguments);

private:
  CObjectFactory* mpObjectFactory;
};

#endif // javaReflection_h__